package io.dy.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author dmj
 * @date 2024年04月18日 下午4:30
 * rabbit配置信息
 */
@Configuration
public class RabbitConfig {

    //========================direct 直连交换机配置=========================//
    /**
     * 直连交换机配置步骤
     *  1、创建直连交换机 DirectExchange
     *  2、创建队列
     *  3、通过路由键绑定交换机和队列(这里的路由键是完全匹配规则)
     */

    @Bean
    public DirectExchange directExchange(){
        // 交换机名字、是否持久化、是否自动删除
        return new DirectExchange("dy.direct.exchange", true, false);
    }

    @Bean
    public Queue directQueue(){
        //队列名称、是否持久化、不知道含义、是否自动删除
        return new Queue("dy.direct.queue01", true, false, false);
    }

    @Bean
    public Binding direct01() {
        // 交换机与队列绑定 指定 routeKey 直连交换机路由key 需要完全匹配
        return BindingBuilder.bind(directQueue()).to(directExchange()).with("direct");
    }



    //========================fanout 扇形/广播 交换机配置=========================//

    @Bean
    public FanoutExchange fanoutExchange(){
        //1.启动的时候，它会根据这个名称 dy.fanout.exchange 先去查找有没有这个交换机，如果有什么都不做，如果没有创建一个新的
        return ExchangeBuilder.fanoutExchange("dy.fanout.exchange").durable(true).build();
        //return new FanoutExchange("dy.fanout.exchange", true, false);
    }

    @Bean
    public Queue fanoutQueue(){
        return QueueBuilder.durable("dy.fanout.queue01").build();
    }

    @Bean
    public Queue fanoutQueue02(){
        return QueueBuilder.durable("dy.fanout.queue02").build();
    }

    @Bean
    public Queue fanoutQueue03(){
        return QueueBuilder.durable("dy.fanout.queue03").build();
    }

    @Bean
    public Binding binding01(){
        //扇形/广播 交换机 绑定队列的时候 无需指定 routeKey(路由key) 交换机会把消息逐个发送到与其绑定的队列中去
        return BindingBuilder.bind(fanoutQueue()).to(fanoutExchange());
    }

    @Bean
    public Binding binding02(){
        //扇形/广播 交换机 绑定队列的时候 无需指定 routeKey(路由key) 交换机会把消息逐个发送到与其绑定的队列中去
        return BindingBuilder.bind(fanoutQueue02()).to(fanoutExchange());
    }

    @Bean
    public Binding binding03(){
        //扇形/广播 交换机 绑定队列的时候 无需指定 routeKey(路由key) 交换机会把消息逐个发送到与其绑定的队列中去
        return BindingBuilder.bind(fanoutQueue03()).to(fanoutExchange());
    }

    //========================topic 主题 交换机配置=========================//

    @Bean
    public TopicExchange topicExchange(){
        return ExchangeBuilder.topicExchange("dy.topic.exchange").durable(true).build();
    }

    @Bean
    public Queue topicQueue01(){
        return QueueBuilder.durable("dy.topic.queue01").build();
    }

    @Bean
    public Queue topicQueue02(){
        return QueueBuilder.durable("dy.topic.queue02").build();
    }

    @Bean
    public Queue topicQueue03(){
        return QueueBuilder.durable("dy.topic.queue03").build();
    }

    @Bean
    public Queue topicQueue04(){
        return QueueBuilder.durable("dy.topic.queue04").build();
    }

    @Bean
    public Binding topicBinding01(){
        return BindingBuilder.bind(topicQueue01()).to(topicExchange()).with("dy.item");
    }

    @Bean
    public Binding topicBinding02(){
        return BindingBuilder.bind(topicQueue02()).to(topicExchange()).with("dy.sku");
    }

    @Bean
    public Binding topicBinding03(){
        return BindingBuilder.bind(topicQueue03()).to(topicExchange()).with("dy.*");
    }

    @Bean
    public Binding topicBinding04(){
        return BindingBuilder.bind(topicQueue04()).to(topicExchange()).with("*.item");
    }
}
